<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
  <script> 
  // 值类型 ：数字Number 字符串String 布尔Boolean 未定义undefined 空null ES:Symbol符号
  // 引用类型:Array数组，Object对象，function函数 es6：map,set,weakmap,weakset,class,promise
  // 定义要区分与定义呢？
  // 值类型存储在栈中，引用类存储在堆中
  // var a = 18;  // a是值类型是18
  // var b = a;  // a的值赋值给b b就是18
  // b=50;      // b的值赋值为50 a的值不受引用
  // console.log(a,b)

//   var obj = {age:18};  //对象值类型 obj变量的值一个内存地址存储在栈中，真正的值存储堆中
//   var temp = obj; // 把obj变量引用的内存地址赋值给temp（temp和obj都用同一个内存地址指向同一直）
//   temp.age = 50;//修改temp对应内存地址的age为50，obj对应内存地址也变为50
//   // console.log(obj,temp)

//   // 值类型key与value存储在栈中，引用的key储栈中，value值存储在堆中
//   // 当把一个引用类型赋值给另外一个变量时候，赋值的内存地址，另个一个变量与当下对象指向一内存
// // typeof 得到结果
// typeof "abc" string
// typeof 123   number
// typeof true  Boolean
// typeof undefined undefined
// typeof null    object

// typeof []    object
// typeof {}    object
// typeof function (){} function 
// class Person{

// }
// typeof Person function
// 类的本质是函数
// typeof 具体的值类型，引用类型，引用类型返回都是object 函数function

// // typeof Array 构造函数
// typeof new Date()
// 内存地址  == 内存地址
// {} =={}  
// [] ==[]
// "123"=="123"
// null==null

// 123=="123"
// == 判断值是否相等 ===判断值和类型是否都相关（推荐===）
// null == undefined
// null ==NaN
// null ==[]

// null === undefined

// 类型自动转换    ! &&  || 转换为布尔值
// var a=parseInt("123a")
// if(a){
//   alert("ok")
// }
// truely falsely变量
// if条件判断中通常使用 truely 或者falsely判断
// 经过2次！转换结果为false的变量称为falsely变量
// false  0  ""  null undefined NaN
// 除了这结果falsely变量其他都是truely
// a = "a";
// if(a){
//   alert("ok");
// }

// var  a = true||123;
// var  b = 0 || "abc"
// var  c = ""||null;
// ||   取值，前面为truely用前面值,否则用后面的值
// localStorage.getItem("user")||"{}"
// var  a = true&&123;
// var b = 0&&"abc";
// var c = "" && null;
// {isLog&&<div>内容</div>}
 
// &&  取值 ，前面truely变量取后面的值否则取前面的值




  </script>
</body>
</html>